package com.daipresents.test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 速度テストの時間を計測するためのクラス
 * @author 藤原さん
 *
 */
public class SpeedTimer {

    /** 罫線 */
    private final static String HR = "------------------------------------";
    /** 日付フォーマット用 */
    private final static SimpleDateFormat DATE_FORMAT = 
        new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
    /** 測定した時間を格納するためのリスト */
    private List<Long> checkPointList = new ArrayList<Long>();
    
    /** デフォルトのコンストラクタ */
    public SpeedTimer(){
    }
    
    /**
     * 実行した時間を記録するメソッド
     * @param millis 記録する時間（ミリ秒）
     */
    public void checkPoint(long millis){
        this.checkPointList.add(millis);
    }
    
    /**
     * テスト前に表示するヘッダ
     * @param i このパラメタを使って「Testing X」のように表示する。
     */
    public void printTestHeader(int i){
        System.out.println("");
        System.out.println("Testing " + i);
    }
    
    /**
     * テスト結果を表示するメソッド。
     */
    public void printResult(){
        for(int i = 0; i < checkPointList.size(); i++){
            
            if(i == 0){
                System.out.println(HR);
                System.out.println("Start time\t" + format(checkPointList.get(i)));
            }else{
                long processingTime = checkPointList.get(i) - checkPointList.get(i - 1);
                
                System.out.println("End time\t" + format(checkPointList.get(i)));
                System.out.println("Processing time(ms)\t" + processingTime);
                System.out.println(HR);
                
                if(i < (checkPointList.size() - 1)){
                    System.out.println("Start time\t" + format(checkPointList.get(i)));
                }
            }
        }
        
        long allProcessingTime = checkPointList.get(checkPointList.size() - 1) - checkPointList.get(0);
        System.out.println("All Processing time(ms)\t" + allProcessingTime);
        System.out.println(HR);
        
        checkPointList = new ArrayList<Long>();
    }
    
    /**
     * 時間（ミリ秒）を文字列形式の日付に変換する
     * @param millis 変換する時間（ミリ秒）
     * @return 日付文字列
     */
    private String format(long millis){
        return DATE_FORMAT.format(millis);
    }
}
